package com.shiguiwu.springmybatis.spring.componentscan.filter;

import com.shiguiwu.springmybatis.spring.componentscan.IScan;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

/**
 * @description: 自定义扫描子接口
 * @author: stone
 * @date: Created by 2021/9/28 23:32
 * @version: 1.0.0
 * @pakeage: com.shiguiwu.springmybatis.spring.componentscan.filter
 *
 *
 * MetadataReader接口
 * 类元数据读取器，可以读取一个类上的任意信息，如类上面的注解信息、类的磁盘路径信息、类的class
 * 对象的各种信息，spring进行了封装，提供了各种方便使用的方法。
 *
 *
 * MetadataReaderFactory接口
 * 类元数据读取器工厂，可以通过这个类获取任意一个类的MetadataReader对象。
 */
public class MyFilter implements TypeFilter {

    /**
     * @param metadataReader        注解信息，spring封装的注解信息类
     * @param metadataReaderFactory 获取注解信息工厂类
     * @return
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //当前被扫描的类
        Class<?> curClass = null;

        try {
            curClass = Class.forName(metadataReader.getClassMetadata().getClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        assert curClass != null;
        return IScan.class.isAssignableFrom(curClass);
    }

}
